home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 June / PCpro_2006_06.ISO / files / freeware / openvip.exe / {app} / render.py < prev    next >
Encoding:
Python Source  |  2003-06-03  |  3.4 KB  |  105 lines

  1. #
  2. # This file is part of OpenVIP (http://openvip.sourceforge.net)
  3. #
  4. # Copyright (C) 2002-2003
  5. # Michal Dvorak, Jiri Sedlar, Antonin Slavik, Vaclav Slavik, Jozef Smizansky
  6. #
  7. # This program is licensed under GNU General Public License version 2;
  8. # see file COPYING in the top level directory for details.
  9. #
  10. # $Id: render.py,v 1.7 2003/06/03 21:01:13 vaclavslavik Exp $
  11. #
  12. # This module provides functions for background rendering, with
  13. # optional progress indicator.
  14. #
  15.  
  16. from wxPython.wx import *
  17. import openvip
  18. import logging, globals, worker
  19.  
  20. #----------------------------------------------------------------------
  21. # Notification event, sent when rendering finishes:
  22. #----------------------------------------------------------------------
  23.  
  24. wxEVT_RENDERING_DONE = wxNewEventType()
  25.  
  26. def EVT_RENDERING_DONE(win, func):
  27.     """Use this to listen to event fired when rendering finishes"""
  28.     win.Connect(-1, -1, wxEVT_RENDERING_DONE, func)
  29.  
  30. class RenderingDoneEvent(wxPyEvent):
  31.     """Event catched using EVT_RENDERING_DONE."""
  32.     def __init__(self, id=None, data=None):
  33.         wxPyEvent.__init__(self)
  34.         self.SetEventType(wxEVT_RENDERING_DONE)
  35.         self.id = id
  36.         self.data = data
  37.  
  38.  
  39. #----------------------------------------------------------------------
  40. # Background rendering thread and helper objects:
  41. #----------------------------------------------------------------------
  42.  
  43. class Rendering:
  44.     """This is a thread that renders a network on background"""
  45.     def __init__(self, job, id, window):
  46.         self.id = id
  47.         self.data = None
  48.         self.window = window
  49.         self.job = job
  50.  
  51.     def run(self):
  52.         self.job.run(self)
  53.         evt = RenderingDoneEvent(self.id, self.data)
  54.         wxPostEvent(self.window, evt)
  55.  
  56. class JobFromString:
  57.     def __init__(self, net, ui):
  58.         self.net = net
  59.         self.ui = ui
  60.     def run(self, obj):
  61.         task = globals.core.load_network_from_string(self.net)
  62.         task.render(self.ui)
  63.  
  64. class JobSingleFrame:
  65.     def __init__(self, task, frame):
  66.         self.task = task
  67.         self.frame = frame
  68.     def run(self, obj):
  69.         obj.data = self.task.render_single_frame(self.frame)
  70.         
  71.  
  72. #----------------------------------------------------------------------
  73. # Public API:
  74. #----------------------------------------------------------------------
  75.  
  76.  
  77. def renderFromString(net, window, id=None,
  78.                      progress=True, cancellable=False,
  79.                      background=True):
  80.     """Renders given network description from 'net' (XML string).
  81.        When finished, sends EVT_RENDERING_DONE event to 'window'. 'id'
  82.        is ID passed to the event, the app can use it as it sees fit.
  83.        'progress'    : display progress bar?
  84.        'cancellable' : can the user cancel the operation?
  85.        'background'  : should it render in background (in another thread)?
  86.        """
  87.     ui = logging.UICallback(background=background,
  88.                             progress=progress, cancellable=cancellable)
  89.     job = JobFromString(net, ui)
  90.     r = Rendering(job, id, window)
  91.     if background:
  92.         worker.enqueue(r.run)
  93.     else:
  94.         r.run()
  95.  
  96.  
  97. def renderSingleFrame(task, frame, window, id=None):
  98.     """Renders single frame on background. 'task' is openvip.Task instance,
  99.        'frame' is number of video frame to render, 'window' and 'id' are
  100.        same as in renderFromString. This function sends same event
  101.        as renderFromString."""
  102.     job = JobSingleFrame(task, frame)
  103.     r = Rendering(job, id, window)
  104.     worker.enqueue(r.run)
  105.